﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DTO;
using AutoMapper;
using System.Data;
using System.Data.Objects;
using System.Data.Entity;


namespace Data
{
   public class SachRepository
    {
       private static SachDTO MapSachEFToSachDTO(SACH sachEF)
       {
           Mapper.CreateMap<SACH,SachDTO>();
           SachDTO sachDTO = Mapper.Map<SACH, SachDTO>(sachEF);
           return sachDTO;
       }
       private static SACH MapSachDTOToSachEF(SachDTO sachdto)
       {
           Mapper.CreateMap<SachDTO, SACH>();
           SACH sachEF = Mapper.Map<SachDTO, SACH>(sachdto);
           return sachEF;

       }
       public static bool KiemTraTonTaiMaSach(int masach)
       {
           bool kq = false; ; 
           using (QuanLyNhaSachEntities context = new QuanLyNhaSachEntities())
           {
               var query = from sach in context.SACHList
                           select sach.MaSach;
            List<int> list=  query.ToList<int>();
            foreach (int i in list)
            {
                if (i == masach)
                    kq = true;
            }                         
           }
           return kq;
       }
       
       public static SachDTO GetSachByID(int masach)
       {
           SachDTO sachDTO = new SachDTO();
           using (QuanLyNhaSachEntities context = new QuanLyNhaSachEntities())
           {
               try
               {
                   var query = (from sach in context.SACHList
                               where sach.MaSach == masach
                               select sach).First();
                   SACH sachEF = (SACH)query;
                   
                   sachDTO = MapSachEFToSachDTO(sachEF);
               }
               catch
               {

               }
           }
           return sachDTO;
       }
       public static List<SachDTO> GetTimSach(SachDTO sachDTO)
       {
           List<SachDTO> list = new List<SachDTO>();
           using (QuanLyNhaSachEntities context = new QuanLyNhaSachEntities())
           {
               if (!string.IsNullOrEmpty(sachDTO.TenSach))
               {
                   var query = from sach in context.SACHList
                               where sach.TenSach.Contains(sachDTO.TenSach)
                               select sach;

                   if (sachDTO.MaNhaXuatBan != 0)
                   {
                       query = from sach in context.SACHList
                               where sach.TenSach.Contains(sachDTO.TenSach) && sach.MaNhaXuatBan == sachDTO.MaNhaXuatBan
                               select sach;
                       if (sachDTO.MaTacGia != 0)
                       {
                           query = from sach in context.SACHList
                                   where sach.TenSach.Contains(sachDTO.TenSach) && sach.MaNhaXuatBan == sachDTO.MaNhaXuatBan
                                   && sach.MaTacGia == sachDTO.MaTacGia
                                   select sach;
                           if (sachDTO.MaTheLoai != 0)
                           {
                               query = from sach in context.SACHList
                                       where sach.TenSach.Contains(sachDTO.TenSach) && sach.MaNhaXuatBan == sachDTO.MaNhaXuatBan
                                         && sach.MaTacGia == sachDTO.MaTacGia && sach.MaTheLoai == sachDTO.MaTheLoai
                                       select sach;
                           }

                       }
                       else
                       {
                           if (sachDTO.MaTheLoai != 0)
                           {
                               query = from sach in context.SACHList
                                       where sach.TenSach.Contains(sachDTO.TenSach) && sach.MaNhaXuatBan == sachDTO.MaNhaXuatBan
                                        && sach.MaTheLoai == sachDTO.MaTheLoai
                                       select sach;
                           }
                       }
                   }
                   else
                   {
                       if (sachDTO.MaTacGia != 0)
                       {
                           query = from sach in context.SACHList
                                   where sach.TenSach.Contains(sachDTO.TenSach)
                                   && sach.MaTacGia == sachDTO.MaTacGia
                                   select sach;
                           if (sachDTO.MaTheLoai != 0)
                           {
                               query = from sach in context.SACHList
                                       where sach.TenSach.Contains(sachDTO.TenSach)
                                         && sach.MaTacGia == sachDTO.MaTacGia && sach.MaTheLoai == sachDTO.MaTheLoai
                                       select sach;
                           }

                       }
                       else
                       {
                           if (sachDTO.MaTheLoai != 0)
                           {
                               query = from sach in context.SACHList
                                       where sach.TenSach.Contains(sachDTO.TenSach)
                                        && sach.MaTheLoai == sachDTO.MaTheLoai
                                       select sach;
                           }
                       }
                   }


                   foreach (SACH sachEF in query)
                   {
                       SachDTO sachDT = MapSachEFToSachDTO(sachEF);
                       list.Add(sachDT);

                   }
               }
               else
               {
                   var query = from sach in context.SACHList                           
                               select sach;

                   if (sachDTO.MaNhaXuatBan != 0)
                   {
                       query = from sach in context.SACHList
                               where sach.TenSach.Contains(sachDTO.TenSach) && sach.MaNhaXuatBan == sachDTO.MaNhaXuatBan
                               select sach;
                       if (sachDTO.MaTacGia != 0)
                       {
                           query = from sach in context.SACHList
                                   where sach.TenSach.Contains(sachDTO.TenSach) && sach.MaNhaXuatBan == sachDTO.MaNhaXuatBan
                                   && sach.MaTacGia == sachDTO.MaTacGia
                                   select sach;
                           if (sachDTO.MaTheLoai != 0)
                           {
                               query = from sach in context.SACHList
                                       where sach.TenSach.Contains(sachDTO.TenSach) && sach.MaNhaXuatBan == sachDTO.MaNhaXuatBan
                                         && sach.MaTacGia == sachDTO.MaTacGia && sach.MaTheLoai == sachDTO.MaTheLoai
                                       select sach;
                           }

                       }
                       else
                       {
                           if (sachDTO.MaTheLoai != 0)
                           {
                               query = from sach in context.SACHList
                                       where sach.TenSach.Contains(sachDTO.TenSach) && sach.MaNhaXuatBan == sachDTO.MaNhaXuatBan
                                        && sach.MaTheLoai == sachDTO.MaTheLoai
                                       select sach;
                           }
                       }
                   }
                   else
                   {
                       if (sachDTO.MaTacGia != 0)
                       {
                           query = from sach in context.SACHList
                                   where sach.TenSach.Contains(sachDTO.TenSach)
                                   && sach.MaTacGia == sachDTO.MaTacGia
                                   select sach;
                           if (sachDTO.MaTheLoai != 0)
                           {
                               query = from sach in context.SACHList
                                       where sach.TenSach.Contains(sachDTO.TenSach)
                                         && sach.MaTacGia == sachDTO.MaTacGia && sach.MaTheLoai == sachDTO.MaTheLoai
                                       select sach;
                           }

                       }
                       else
                       {
                           if (sachDTO.MaTheLoai != 0)
                           {
                               query = from sach in context.SACHList
                                       where sach.TenSach.Contains(sachDTO.TenSach)
                                        && sach.MaTheLoai == sachDTO.MaTheLoai
                                       select sach;
                           }
                       }
                   }


                   foreach (SACH sachEF in query)
                   {
                       SachDTO sachDT = MapSachEFToSachDTO(sachEF);
                       list.Add(sachDT);

                   }

               }
                   
                      
                         

           }
           return list;
         
       }
       public static List<SachDTO> GetAllSach()
       {
           List<SachDTO> list = new List<SachDTO>();
           try
           {
               using (QuanLyNhaSachEntities context = new QuanLyNhaSachEntities())
               {


                   var query = from sach in context.SACHList
                               select sach;
                   foreach (var sachef in query)
                   {

                       SachDTO sachdto = MapSachEFToSachDTO(sachef);
                       list.Add(sachdto);
                   }
               }
           }
           catch(Exception)
           {

           }
           return list;
       }
       public static bool Insert(SachDTO sachdto)
       {
           bool kq = true;
           using (QuanLyNhaSachEntities context = new QuanLyNhaSachEntities())
           {                            
               try
               {
                   SACH sachEF = new SACH();
                   sachEF = MapSachDTOToSachEF(sachdto);
                   context.AddToSACHList(sachEF);
                   context.SaveChanges();
               }
               catch (Exception)
               {
                   kq = false;
               }
              
           }
           return kq;
                        
       }
       public static bool Update(SachDTO sachdto)
       {
           bool kq = true;
           using (QuanLyNhaSachEntities context = new QuanLyNhaSachEntities())
           {
               
               context.sp_UpDateSach_Sach(sachdto.MaSach, sachdto.TenSach, sachdto.MaTheLoai, sachdto.MaTacGia, sachdto.SoLuongTon, sachdto.DonGia, sachdto.MaNhaXuatBan);
               try
               {
                  /*/* EntityKey key = context.CreateEntityKey("SACHList", new SACH { MaSach = sachdto.MaSach });
                   SACH origSach = context.GetObjectByKey(key) as SACH;
                 //  context.Detach(origSach);
                 //  context.Attach(origSach);*/
                  // SACH updateSach = MapSachDTOToSachEF(sachdto);
                   //context.ApplyCurrentValues<SACH>("SACHList", updateSach);
                 /*  origSach = updateSach;
                   context.Attach(origSach);
                   context.SaveChanges();
                   context.SACHList.ApplyOriginalValues(updateSach);*/
                 
                  context.SaveChanges();
                 
               }
               catch
               {
                   kq = false;
               }
           }
           return kq;
       }
    }
}
